package com.nova.tools.realtime;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateUtils
{

	/** 数据库存储的时间格式串，如yyyymmdd 或yyyymmddHHMiSS */
	public static final int DB_STORE_DATE = 1;
	/** 用连字符-分隔的时间时间格式串，如yyyy-mm-dd 或yyyy-mm-dd HH:Mi:SS */
	public static final int HYPHEN_DISPLAY_DATE = 2;
	/** 用连字符.分隔的时间时间格式串，如yyyy.mm.dd 或yyyy.mm.dd HH:Mi:SS */
	public static final int DOT_DISPLAY_DATE = 3;
	/** 用中文字符分隔的时间格式串，如yyyy年mm月dd 或yyyy年mm月dd HH:Mi:SS */
	public static final int CN_DISPLAY_DATE = 4;
	/***** 数据库存储时间格式串,如yyyymmddHHMMSS **/
	public static final int DB_LONG_DATE = 5;

	/**
	 * 得到精确到秒的格式化当前时间串
	 * 
	 * @param formatType
	 *            时间格式的类型{@link #DB_STORE_DATE},{@link #EN_HTML_DISPLAY_DATE},
	 *            {@link #CN_HTML_DISPLAY_DATE}
	 * @return 当前时间格式化时间串
	 */
	public static String getCurrTimeStr(int formatType)
	{
		return getTimeStr(new Date(), formatType);
	}

	/**
	 * 得到精确到秒的格式化时间串
	 * 
	 * @param date
	 *            指定时间
	 * @param formatType
	 *            时间格式的类型{@link #DB_STORE_DATE},{@link #EN_HTML_DISPLAY_DATE},
	 *            {@link #CN_HTML_DISPLAY_DATE}
	 * @return 指定时间的格式化时间串
	 */
	public static String getTimeStr(Date date, int formatType)
	{
		if (formatType < DB_STORE_DATE || formatType > DB_LONG_DATE)
		{
			throw new IllegalArgumentException("时间格式化类型不是合法的值。");
		}
		else
		{
			String formatStr = null;
			switch (formatType)
			{
				case DB_STORE_DATE:
					formatStr = "yyyyMMddHHmmss";
					break;
				case HYPHEN_DISPLAY_DATE:
					formatStr = "yyyy'-'MM'-'dd HH:mm:ss";
					break;
				case DOT_DISPLAY_DATE:
					formatStr = "yyyy.MM.dd HH:mm:ss";
					break;
				case CN_DISPLAY_DATE:
					formatStr = "yyyy'年'MM'月'dd'日' HH:mm:ss";
					break;
				case DB_LONG_DATE:
					formatStr = "yyyyMMddHHmmssSSS";
			}
			SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
			return sdf.format(date);
		}
	}

	/**
	 * 得到两个日期相差的天数
	 * 
	 * @param date1
	 *            开始日期
	 * @param date2
	 *            结束日期
	 */
	public static int getBetweenDay(String str_date1, String str_date2)
	{
		int days = 0;

		try
		{
			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
			Date date1 = sf.parse(str_date1);
			Date date2 = sf.parse(str_date2);
			Calendar d1 = new GregorianCalendar();
			d1.setTime(date1);
			Calendar d2 = new GregorianCalendar();
			d2.setTime(date2);
			days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
			System.out.println("days=" + days);
			int y2 = d2.get(Calendar.YEAR);
			if (d1.get(Calendar.YEAR) != y2)
			{
				// d1 = (Calendar) d1.clone();
				do
				{
					days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
					d1.add(Calendar.YEAR, 1);
				} while (d1.get(Calendar.YEAR) != y2);
			}
		} catch (ParseException e)
		{
			e.printStackTrace();
		}

		return days;
	}

	/**
	 * 在当前日期上相加 days 天
	 * 
	 * @param days
	 *            加的天数
	 */
	public static String currentDateAdd_N(int days)
	{

		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, days);
		return sf.format(c.getTime());
	}
}
